package com.chen.demo.cas.service;

import com.chen.demo.cas.entity.Perms;
import com.chen.demo.cas.entity.RolePerms;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.cas.authentication.CasAssertionAuthenticationToken;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.AuthenticationUserDetailsService;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Service
@Slf4j
public class CasUserDetailServiceImpl implements AuthenticationUserDetailsService<CasAssertionAuthenticationToken> {
//    @Override
//    public UserDetails loadUserDetails(Authentication token) throws UsernameNotFoundException {
//        return null;
//    }

//    之前在没有使用CAS时，是在loadUserByUsername进行用户账号密码校验的；
//    但使用CAS后，账号密码校验将在CAS Server进行，而不是CAS Client；
//    我们只需要在配置文件里配置下相关数据库表即可。参考链接：https://cloud.tencent.com/developer/article/1641598
    @Override
    public UserDetails loadUserDetails(CasAssertionAuthenticationToken token) throws UsernameNotFoundException {
        log.info("登录用户名："+token.getName());
        //由于登录交由cas服务端管理，如果进入这里代表登录成功，可不做任何操作，也可以根据自身系统业务开发相关功能代码
        //如根据用户名封装用户基本信息，角色权限等,一般自定义实现UserDetails接口的用户类
        //TODO 为了测试，这里为死代码

        String username = token.getName();
        String password="Mellon";
        List<RolePerms> roles = new ArrayList<>();
        RolePerms rolePerms = new RolePerms();
        ArrayList<Perms> perms = new ArrayList<>();
        perms.add(new Perms("1","role::add"));
        perms.add(new Perms("2","role::delete"));
        perms.add(new Perms("3","role::add"));
        rolePerms.setId("1").setRoleCode("ROLE_HELLO").setPerms(perms);
        roles.add(rolePerms);
        return new User(username,password,roles);
    }
}
